#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

/* 
 * nl_langinfo，nl_langinfo_l - 查询语言和语言环境信息
 *
 * char *nl_langinfo(nl_item item); 
 * char *nl_langinfo_l(nl_item item, locale_t locale); 
 */

#if 0

与localeconv(3)相比，nl_langinfo()和nl_langinfo_l()函数以更灵活的方式提供对区域设置信息的访问。 nl_langinfo()返回一个字符串，该字符串是与程序当前全局语言环境中的item对应的值。 nl_langinfo_l()返回一个字符串，该字符串是与语言环境对象语言环境所标识的语言环境的项目相对应的值，该语言环境先前由newlocale(1)创建。可以查询语言环境类别的各个元素和其他元素。

可以使用中定义的常量在item中指定的locale元素示例：

CODESET(LC_CTYPE)
    返回带有所选语言环境中使用的字符编码名称的字符串，例如" UTF-8"，" ISO-8859-1"或" ANSI_X3.4-1968"(通常称为US-ASCII)。这是使用" locale charmap"获得的字符串。有关字符编码名称的列表，请尝试" locale -m"(请参阅​​locale(1))。 
D_T_FMT(LC_TIME)
    返回一个字符串，该字符串可用作strftime(3)的格式字符串，以特定于语言环境的方式表示时间和日期(％c转换规范)。 
D_FMT(LC_TIME)
    返回一个字符串，该字符串可用作strftime(3)的格式字符串，以特定于语言环境的方式表示日期(％x转换规范)。 
T_FMT(LC_TIME)
    返回一个字符串，该字符串可用作strftime(3)的格式字符串，以特定于语言环境的方式表示时间(％X转换规范)。 
AM_STR(LC_TIME)
    返回一个表示后缀(在中午之前，" AM")时间的词缀的字符串。 (在％p strftime(3)转换规范中使用。) 
PM_STR(LC_TIME)
    返回一个表示后缀(在午夜之前，" PM")时间的词缀的字符串。 (在％p strftime(3)转换规范中使用。) 
T_FMT_AMPM(LC_TIME)
    返回一个字符串，该字符串可用作strftime(3)的格式字符串，以表示上午或下午的时间。表示法，一种特定于语言环境的方式(％r转换规范)。 
ERA(LC_TIME)
    Return era description, which contains information about how years are counted and displayed for each era in a locale. Each era description segment shall have the format:

            方向：偏移：开始日期：结束日期：时代名称：时代格式 

    according to the definitions below:

        direction
            [dq] + [dq]或[dq]-[dq]字符。 [dq] + [dq]表示年份从开始日期到结束日期增加，[dq]-[dq]表示相反。 
        offset
            start_date的纪元年。 
        start_date
            格式为yyyy / mm / dd的日期，其中yyyy，mm和dd分别是时代开始的年，月和日。 
        end_date
            时代的结束日期，格式与开始日期相同，或者是两个特殊值[dq]-* [dq](负无穷大)或[dq] + * [dq](正无穷大)之一。 
        era_name
            时代的名称，与％EC strftime(3)转换规范相对应。 
        era_format
            时代中的年份格式，对应于％EY strftime(3)转换规范。 

    时代描述段用分号分隔。大多数语言环境未定义此值。确实定义了此值的语言环境包括日语和泰国语言环境。 
ERA_D_T_FMT(LC_TIME)
    返回一个字符串，该字符串可以用作strftime(3)的格式字符串，以特定于语言环境的方式(％Ec转换规范)来表示时间和日期。 
ERA_D_FMT(LC_TIME)
    返回一个字符串，该字符串可用作strftime(3)的格式字符串，以特定于语言环境的方式(％Ex转换规范)替代日期表示。 
ERA_T_FMT(LC_TIME)
    返回一个字符串，该字符串可用作strftime(3)的格式字符串，以特定于语言环境的方式(％EX转换规范)替代时间表示。 
DAY_{1-7} (LC_TIME)
    返回一周中第n天的名称。 [警告：这遵循美国惯例DAY_1 =星期日，而不是周一是一周的第一天的国际惯例(ISO 8601)。](在％A strftime(3)转换规范中使用。) 
ABDAY_{1-7} (LC_TIME)
    返回一周中第n天的缩写名称。 (在％a strftime(3)转换规范中使用。) 
MON_{1-12} (LC_TIME)
    返回第n个月的名称。 (在％B strftime(3)转换规范中使用。) 
ABMON_{1-12} (LC_TIME)
    返回第n个月的缩写名称。 (在％b strftime(3)转换规范中使用。) 
RADIXCHAR(LC_NUMERIC)
    返回基数字符(小数点，小数逗号等)。 
THOUSEP(LC_NUMERIC)
    返回千位分隔符(三位数字的组)。 
YESEXPR(LC_MESSAGES)
    返回可与regex(3)函数一起使用的正则表达式，以识别对是/否问题的肯定回答。 
NOEXPR(LC_MESSAGES)
    返回可与regex(3)函数一起使用的正则表达式，以识别对是/否问题的否定响应。 
CRNCYSTR(LC_MONETARY)
    返回货币符号，如果该符号应出现在值之前，则返回"-"，如果该符号应出现在值之后，则返回" +"，否则返回"。"。该符号是否应替换基数字符。 

返回值

成功执行后，这些函数将返回指向字符串的指针，该字符串是与指定语言环境中的item对应的值。

如果setlocale(3)没有为适当的类别选择任何语言环境，则nl_langinfo()返回一个指向" C"语言环境中相应字符串的指针。如果语言环境指定了未定义langinfo数据的语言环境，则nl_langinfo_l()的情况也是如此。

如果item无效，则返回指向空字符串的指针。

这些函数返回的指针可能指向静态数据，这些静态数据可能会被后续的nl_langinfo()，nl_langinfo_l()或setlocale(3)调用而覆盖，或者指针本身可能无效。如果通过freelocale(3)或newlocale(3)释放或修改语言环境引用的语言环境对象，则相同的语句适用于nl_langinfo_l()。

POSIX指定应用程序不得修改这些函数返回的字符串。

如果语言环境是特殊语言环境对象LC_GLOBAL_LOCALE或不是有效的语言环境对象句柄，则nl_langinfo_l()的行为是不确定的。

#endif 


int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "");
    setlocale(LC_NUMERIC, "");

    printf("%s\n", nl_langinfo(CODESET));		// UTF-8
    printf("%s\n", nl_langinfo(RADIXCHAR));		// .
	printf("%s\n", nl_langinfo(14));			// UTF-8

    exit(EXIT_SUCCESS);
}


